#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h> // 全局变量（临界资源），所有库函数都会修改它
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <pthread.h> // POSIX thread

// 线程例程
void * routine(void * arg)
{
    printf("i: %ld\n", (long)arg);

    // 分离当前线程，使其在退出之后自动释放资源
    // 已处于分离状态的线程，无法返回值
    pthread_detach(pthread_self());

    // int i=0;
    // while(1)
    // {
    //     fprintf(stderr, "%c", 'a'+i);
    //     i++;
    //     i %= 26;
    //     usleep(100*1000);
    // }

    pthread_exit("abcd"); // 退出当前线程
    exit(0);           // 退出当前进程（即退出所有线程，进程其实就是线程组）
}

pthread_once_t once = PTHREAD_ONCE_INIT;

void init_routine(void)
{
    fprintf(stderr, "%s被调用\n", __FUNCTION__);
}

int main(int argc, char const *argv[])
{


    pthread_once(&once, init_routine);
    pthread_once(&once, init_routine);
    pthread_once(&once, init_routine);
    pthread_once(&once, init_routine);

    pthread_t tid;
    for(long i=0; i<5; i++)
        pthread_create(&tid, NULL, routine, (void *)i);

    pthread_exit(NULL); // 主线程退出


    // 睡眠1秒，确保子线程调用了分离函数
    // 从而验证下述pthread_join()失败的情况
    sleep(1);

    // 获取指定线程的退出值，顺便释放线程资源
    char *p;
    int err = pthread_join(tid, (void *)&p); //  wait(NULL);/waitpid()
    if(err == 0)
        printf("线程接合成功，退出值是: %s\n", p);
    else
        printf("线程接合失败：%s\n", strerror(err));

    int i=0;
    while(1)
    {
        fprintf(stderr, "%d", i++);
        usleep(100*1000);
    }

    return 0;
}
